#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct f{
	char a,b,c,d,e,g,h,i,j;
	int step;
	f(char a,char b,char c,char d,char e,char g,char h,char i,char j,int step):a(a),b(b),c(c),d(d),e(e),g(g),h(h),i(i),j(j),step(step){
		
	}
};
bool b[10][10][10][10][10][10][10][10][10];
char a[4][4];
int s = -1;
void bfs(){
	queue<f>q;
	char a1 = a[1][1],a2 = a[1][2],a3 = a[1][3],a4 = a[2][1],a5 = a[2][2],a6 = a[2][3],a7 = a[3][1],a8 = a[3][2],a9 = a[3][3];
	q.push(f(a1,a2,a3,a4,a5,a6,a7,a8,a9,0));
	b[a1][a2][a3][a4][a5][a6][a7][a8][a9] = false;
	while(!q.empty()){
		f p = q.front();
		if(p.a==1&&p.b==2&&p.c==3&&p.d==4&&p.e==5&&p.g==6&&p.h==7&&p.i==8&&p.j==9){
			s = p.step;
			return;
			
		}q.pop();
		for(int i = 0;i<12;++i){
			if(i==0){
				a1 = p.c;
				a2 = p.a;
				a3 = p.b;
				
			}if(i==1){
				a1 = p.b;
				a2 = p.c;
				a3 = p.a;
				
			}if(i==2){
				a4 = p.g;
				a5 = p.d;
				a6 = p.e;
				
			}if(i==3){
				a4 = p.e;
				a5 = p.g;
				a6 = p.d;
				
			}if(i==4){
				a7 = p.j;
				a8 = p.h;
				a9 = p.i;
				
			}if(i==5){
				a7 = p.i;
				a8 = p.j;
				a9 = p.h;
				
			}if(i==6){
				a1 = p.h;
				a4 = p.a;
				a7 = p.d;
				
			}if(i==7){
				a1 = p.d;
				a4 = p.h;
				a7 = p.a;
				
			}if(i==8){
				a2 = p.i;
				a5 = p.b;
				a8 = p.e;
				
			}if(i==9){
				a2 = p.e;
				a5 = p.i;
				a8 = p.d;
				
			}if(i==10){
				a3 = p.j;
				a6 = p.c;
				a9 = p.g;
				
			}if(i==11){
				a3 = p.g;
				a6 = p.j;
				a9 = p.c;
				
			}
			if(b[a1][a2][a3][a4][a5][a6][a7][a8][a9]){
				q.push(f(a1,a2,a3,a4,a5,a6,a7,a8,a9,p.step+1));
				b[a1][a2][a3][a4][a5][a6][a7][a8][a9] = false;
			}
		}
	}
}int main(){
	int o;
	memset(b,true,sizeof(b));
	for(int i = 1;i<4;++i)
		for(int j = 1;j<4;++j){
			cin>>o;
			a[i][j]=(char)o;
		}
	bfs();
	cout<<s;
	return 0;
	
}
/*
3 1 2
4 5 6
7 8 9

*/